package control;

import model.Constants;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Monitor;
import org.eclipse.swt.widgets.Shell;

import view.MemoryCard;
import view.resources.Images;

public class Util {

	private static int iX;
	private static int iY;
	private static int iWidth;
	private static int iHeight;

	public static void centerFrame(Shell shell) {

		Monitor primary = shell.getDisplay().getPrimaryMonitor();

		iHeight = primary.getClientArea().height;
		iWidth = primary.getClientArea().width;
		iX = (iWidth / 2) - (shell.getBounds().width / 2);
		iY = (iHeight / 2) - (shell.getBounds().height / 2);

		shell.setLocation(iX, iY);
	}

	public static void checkCards() {

		if (Storage.getInstance().getCards().size() == 2) {
			Storage.getInstance().increaseTurn();
			endTurn();
		}
	}

	public static void closeWindow(Shell shell) {
		shell.dispose();

	}

	private static void endTurn() {
		Storage.getInstance().setTurnPause(true);
		if (validateCards()) {
			if (Storage.getInstance().isPlayerTurn()) {
				Storage.getInstance().increasePlayerPair();
				for (MemoryCard element : Storage.getInstance().getCards()) {
					element.getButton()
							.setBackground(
									Display.getCurrent().getSystemColor(
											SWT.COLOR_BLUE));
				}
			} else {
				Storage.getInstance().increaseEnemyPair();
				for (MemoryCard element : Storage.getInstance().getCards()) {
					element.getButton().setBackground(
							Display.getCurrent().getSystemColor(SWT.COLOR_RED));
				}
			}
		} else {

			if (Storage.getInstance().isPlayerTurn()) {
				Storage.getInstance().setPlayerTurn(false);
				Storage.getInstance()
						.getCurrentPlayer()
						.setText(
								Constants.CURRENTPLAYER
										+ Storage.getInstance().getEnemyName());
			} else {
				Storage.getInstance().setPlayerTurn(true);
				Storage.getInstance()
						.getCurrentPlayer()
						.setText(
								Constants.CURRENTPLAYER
										+ Storage.getInstance().getPlayerName());
			}

			for (MemoryCard element : Storage.getInstance().getCards()) {

				element.getButton().setImage(Images.DEFAULT.createImage());
				element.getButton().update();
				element.setbActive(false);
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
				}

			}
		}

		Storage.getInstance().getCards().clear();
		Storage.getInstance().setTurnPause(false);
		Storage.getInstance()
				.getTurnCount()
				.setText(
						Constants.CURRENTTURNSCOUNT
								+ Storage.getInstance().getTurnsCount());
		if (isGameDone()) {
			String winner;
			if (Storage.getInstance().getEnemyPairCount() < Storage
					.getInstance().getPlayerPairCount()) {
				winner = Storage.getInstance().getPlayerName();
			} else if (Storage.getInstance().getEnemyPairCount() == Storage
					.getInstance().getPlayerPairCount()) {
				winner = Constants.BOTHWIN;
			} else {
				winner = Storage.getInstance().getEnemyName();
			}

			MessageBox winnerMessage = new MessageBox(Display.getCurrent()
					.getActiveShell(), SWT.OK | SWT.APPLICATION_MODAL
					| SWT.ICON_INFORMATION);

			winnerMessage.setText(Constants.WINNERTITLE);
			if (winner.equals(Constants.BOTHWIN)) {
				winnerMessage.setMessage(Constants.BOTHWIN);
			} else {
				winnerMessage.setMessage(Constants.WINNERIS + winner);
			}
			winnerMessage.open();

		}
	}

	public static void resetStats() {
		Storage.getInstance().clearEnemyTurns();
		Storage.getInstance().clearPlayerTurns();
		Storage.getInstance().clearTurns();

	}

	public static int getRandomNumber(int low, int high) {

		return (int) ((Math.random() * (high - low)) + low);

	}

	private static boolean isGameDone() {
		int x = Storage.getInstance().getSize();
		if ((Storage.getInstance().getPlayerPairCount() + Storage.getInstance()
				.getEnemyPairCount()) == ((x * x) / 2)) {
			return true;
		}
		return false;
	}

	private static boolean validateCards() {
		MemoryCard one = Storage.getInstance().getCards().get(0);
		MemoryCard two = Storage.getInstance().getCards().get(1);

		if (one.getImageNumber() == two.getImageNumber()) {
			return true;
		}
		return false;

	}

	public static boolean validateInput(String text) {
		if (text.trim().isEmpty() || (text == null)) {
			return false;
		}
		return true;

	}

	private Util() {

	}

}
